#ifndef _ENCODE_DEF__H
#define _ENCODE_DEF__H
#include <stdint.h>
typedef union
{
	uint8_t data[4];
	uint32_t value;
}EncodeUint32;

typedef void (*Encode_Transmit)(uint8_t *,uint8_t *,uint16_t);
typedef void (*Encode_I2C_Transmit)(uint8_t,uint8_t,uint16_t,uint8_t,uint8_t *,uint16_t);    //I2C 通信函数
typedef void (*Encode_I2C_Receive)(uint8_t,uint8_t *,uint16_t);    //I2C 接收函数
typedef uint32_t (*Encode_Function)(void);
#define EncodeError      0xEEEEEEEE
typedef enum
{
    Motor_Encode1=0,
    Motor_Encode2=1,
    Angle_Encode1=3,
    Angle_Encode2=4,
	  MT6709=5
}Encoder_List;
/******************************
 * 编码器SPI通信数据长度
 * ***************************/
typedef enum
{
	Encode_SPI_Data_8BIT=0,
	Encode_SPI_Data_16BIT=1,
	Encode_SPI_Data_32BIT=2
}SPI_Transmit_Size;
/****************************
 * SPI模式
 * **************************/
typedef enum
{
	SPI_Model_0=0,
	SPI_Model_1=1,
	SPI_Model_2=2,
	SPI_Model_3=3
}SPI_Model;
/*****************************
 * 编码器通信方式
 * **************************/
typedef enum
{
	Encode_I2C=0,
	Encode_SPI=1
}Encode_Port_Type;
typedef enum
{
	I2C_READ=0,
	I2C_WRITE=1
}I2C_ReadWrite_Type;
/****************************
 * SPI 端口定义
 * *************************/
typedef struct
{
	SPI_Model model;
	SPI_Transmit_Size data_size; 
}Encode_SPI_Port_Def_t;
/****************************
 * SPI 端口定义
 * *************************/
typedef struct
{
	uint8_t dev_addr;
	Encode_I2C_Transmit        i2c_transmit_send;                  //I2C通信函数
	Encode_I2C_Receive         i2c_receive;
}Encode_I2C_Port_Def_t;
typedef struct 
{
	uint8_t cylinder_number;
}Encode_LightPan_Port_Def_t;
/****************************
 * 编码器接口定义
 * **************************/
typedef struct
{
	Encode_Port_Type           Port_type;                     //编码器接口类型
	Encode_Transmit            transmit;                      //接口通信函数
	Encode_SPI_Port_Def_t      Spi;                           //SPI接口
	Encode_I2C_Port_Def_t      i2c;                           //I2C接口
	Encode_LightPan_Port_Def_t light_pan;                     //计步方式
}Encode_Port_Def_t;

/*****************************
 * 编码器值
 * **************************/
typedef struct
{
    uint32_t                   Resolution;                    //编码器分辨率
	  uint8_t                    Bits;                          //编码器位数
	  uint32_t                   encode_value;                  //编码器值
    uint8_t                    status;                        //编码器状态                  
}Encode_Value;

/****************************
 * 编码器结构体
 * *************************/
typedef struct
{
    Encode_Value               value;                           //编码器值
	  uint32_t                   last_value;                      //编码器上一次的值
	  uint32_t                   offset_value;                    //编码器偏移值
	  uint32_t                   user_value;                      //偏移之后的值
		Encoder_List               encoder_type;                    //编码器类型
	  Encode_Function            read_value;                      //编码器读取函数
}Encode_Def_t;

/**************************
 * 用户层使用编码器接口
 * ***********************/
typedef struct 
{
    Encode_Value            value;                        //编码器值
	  Encoder_List            encoder_type;                 //编码器类型
	  uint32_t                offset_value;                 //编码器偏移值
	  uint32_t                user_value;                   //偏移之后的值
	  uint8_t                 Enable_ValueMI;               //编码器值镜像                                
}UserEncode_Def_t;

#endif
